package com.liliudong.rommath.biz.sys.service;


import cn.hutool.core.lang.tree.Tree;
import com.liliudong.rommath.biz.sys.entity.SysMenu;
import com.liliudong.rommath.biz.sys.param.SysMenuAddParam;
import com.liliudong.rommath.biz.sys.param.SysMenuModifyParam;
import com.liliudong.rommath.biz.sys.result.SysMenuChildrenResult;
import com.liliudong.rommath.biz.sys.result.SysMenuDetailResult;
import com.liliudong.rommath.common.consts.RommathConst;
import com.mybatisflex.core.query.QueryChain;
import com.mybatisflex.core.service.IService;

import java.util.List;

import static com.liliudong.rommath.biz.sys.entity.table.SysMenuTableDef.SYS_MENU;

/**
 * 系统菜单 服务层。
 *
 * @author liudong.li
 * @since 1.0.0
 */
public interface SysMenuService extends IService<SysMenu> {

    default QueryChain<SysMenu> queryChainIgnoreDataPermission() {
        return queryChain()
                .from(SYS_MENU.as(RommathConst.IGNORE_TABLE_ALIAS));
    }

    /**
     * 按使用id选择权限
     *
     * @param userId 用户id
     * @return {@link List }<{@link String }>
     */
    List<String> selectPermissionsByUseIdIgnoreDataPermission(Long userId);


    /**
     * 路由列表
     *
     * @return {@link List }<{@link Tree }<{@link Long }>>
     */
    List<Tree<Long>> routes();

    /**
     * 添加
     *
     * @param param param
     */
    void add(SysMenuAddParam param);

    /**
     * 按id删除
     *
     * @param id 身份证件
     */
    void deleteById(Long id);

    /**
     * 修改
     *
     * @param param param
     */
    void modify(SysMenuModifyParam param);

    /**
     * 树形
     *
     * @return {@link List }<{@link Tree }<{@link Long }>>
     */
    List<Tree<Long>> tree(List<SysMenu.MenuType> excludeTypes);

    /**
     * 子级
     *
     * @param id 身份证件
     * @return {@link List }<{@link SysMenuChildrenResult }>
     */
    List<SysMenuChildrenResult> children(Long id);

    /**
     * 按id详细信息
     *
     * @param id 身份证件
     * @return {@link SysMenuDetailResult }
     */
    SysMenuDetailResult detailById(Long id);
}